Popular Searches
Popular Course Categories
Popular Courses

Understanding parent-child relationships between widgets

Understanding parent-child relationships between widgets

Flutter Fundamentals

Understanding Parent-Child Relationships Between Widgets in Flutter

Parent-child relationships are a fundamental concept in Flutter UI development. Flutter creates user interfaces by composing widgets inside other widgets. A widget that contains another widget is called the parent, while the widget contained inside it is called the child. Flutter's widget system is based heavily on composition and hierarchical relationships. :contentReference[oaicite:0]{index=0}

Related Flutter Training: JustAcademy Flutter Training | Register for Flutter Course Demo


1. What is a Parent Widget?

A parent widget is a widget that contains one or more other widgets.

For example:

Center(
  child: Text('Hello Flutter'),
)

In this example, Center is the parent widget because it contains the Text widget.

Center
└── Text

2. What is a Child Widget?

A child widget is a widget placed inside another widget.

In the following example:

Container(
  child: Text('Welcome'),
)

Text is the child of Container.

Container
└── Text

3. Parent-Child Relationship in Simple Terms

You can think of the relationship like a family tree:

Parent
└── Child

A more complex Flutter interface can have several levels:

Grandparent
└── Parent
    └── Child
        └── Grandchild

For example:

Scaffold
└── Center
    └── Container
        └── Text

Here:

  • Scaffold is the parent of Center.
  • Center is the parent of Container.
  • Container is the parent of Text.
  • Text is the final child in this branch.

4. Why Does Flutter Use Parent-Child Relationships?

Flutter uses widget composition to build complex interfaces from smaller components. A widget can provide layout, styling, behavior, constraints, or data to widgets below it in the hierarchy.

  • It makes UI composition easier.
  • It allows widgets to be reused.
  • It separates different UI responsibilities.
  • It makes complex screens easier to organize.
  • It provides a structured widget hierarchy.
  • It allows layout constraints to move through the hierarchy.
  • It allows information such as theme data to be accessed by descendants.

5. The Basic child Property

Many Flutter widgets accept a single widget through a property called child.

Example:

Center(
  child: Text('Hello'),
)

Here, Center accepts one child.

Center
└── Text

Common single-child widgets include:

WidgetCommon Child PropertyPurpose
CenterchildCenters a child
ContainerchildProvides layout and decoration
PaddingchildAdds padding around a child
AlignchildPositions a child within itself
SizedBoxchildProvides a specific size
CardchildDisplays content inside a Material card

6. The children Property

Some widgets can contain multiple children. These widgets commonly use a children property.

Example:

Column(
  children: [
    Text('Name'),
    Text('Email'),
    Text('Phone'),
  ],
)

The tree is:

Column
├── Text
├── Text
└── Text

Common multi-child widgets include Row, Column, Stack, ListView, and Wrap. :contentReference[oaicite:1]{index=1}


7. Single Child vs Multiple Children

FeatureSingle ChildMultiple Children
Propertychildchildren
Number of widgetsUsually oneMultiple
ExampleCenterColumn
Example CodeCenter(child: Text('Hi'))Column(children: [Text('A'), Text('B')])

8. Example of a Parent with One Child

Container(
  width: 200,
  height: 100,
  color: Colors.blue,
  child: const Text(
    'Hello Flutter',
  ),
)

Widget relationship:

Container
└── Text

The Container controls properties such as size, color, padding, margin, and decoration, while the Text displays the content.


9. Example of a Parent with Multiple Children

Column(
  children: [
    const Text('Flutter'),
    const Icon(Icons.favorite),
    ElevatedButton(
      onPressed: () {},
      child: const Text('Continue'),
    ),
  ],
)

Widget tree:

Column
├── Text
├── Icon
└── ElevatedButton
    └── Text

Notice that ElevatedButton itself has a child. Therefore, a widget can simultaneously be a child of one widget and a parent of another widget.


10. A Widget Can Be Both Parent and Child

This is an important concept.

Consider:

Container(
  child: Center(
    child: Text('Flutter'),
  ),
)

The relationships are:

Container
└── Center
    └── Text
  • Container is a parent.
  • Center is a child of Container.
  • Center is also a parent of Text.
  • Text is a child of Center.

11. Grandparent, Parent, and Child Relationship

When widgets are nested several levels deep, the relationship can be described as grandparent, parent, child, and so on.

Scaffold
└── Padding
    └── Column
        └── Text

In this example:

  • Scaffold is the grandparent of Column.
  • Padding is the parent of Column.
  • Column is the parent of Text.
  • Text is the child of Column.

12. Parent-Child Relationship with Row

Row arranges its children horizontally.

Row(
  children: [
    const Icon(Icons.home),
    const SizedBox(width: 10),
    const Text('Home'),
  ],
)

Widget tree:

Row
├── Icon
├── SizedBox
└── Text

Here, Row is the parent of all three widgets.


13. Parent-Child Relationship with Column

Column arranges its children vertically.

Column(
  children: [
    const Text('Username'),
    const Text('Email'),
    const Text('Phone'),
  ],
)

Widget tree:

Column
├── Text
├── Text
└── Text

14. Parent-Child Relationship with Stack

Stack allows multiple children to overlap each other.

Stack(
  children: [
    Container(
      width: 200,
      height: 200,
      color: Colors.blue,
    ),
    const Text('Flutter'),
  ],
)

Widget tree:

Stack
├── Container
└── Text

The Stack is the parent, while the Container and Text are its children.


15. Nested Parent-Child Relationships

Flutter allows widgets to be nested to create complex layouts.

Container(
  padding: const EdgeInsets.all(20),
  child: Column(
    children: [
      const Text('Welcome'),
      Row(
        children: [
          const Icon(Icons.person),
          const Text('User'),
        ],
      ),
    ],
  ),
)

Tree:

Container
└── Column
    ├── Text
    └── Row
        ├── Icon
        └── Text

16. Parent Controls Layout of Children

A parent widget often influences how its child is laid out. Flutter's layout model is based on constraints. A simplified rule is:

Constraints go down.
Sizes go up.
Parent sets position.

A parent gives constraints to its child. The child chooses a size within those constraints, and the parent determines the child's position. :contentReference[oaicite:2]{index=2}

For example:

Center(
  child: SizedBox(
    width: 200,
    height: 100,
    child: Text('Hello'),
  ),
)

Here, Center provides the context for positioning its child, while SizedBox imposes a size on its own child.


17. Parent Widgets and Constraints

Understanding constraints is important when working with parent-child relationships.

For example:

Container(
  width: 300,
  child: Text('Hello Flutter'),
)

The parent Container provides constraints that affect the available width for its child.

Flutter's layout process can be summarized as:

  1. The parent receives constraints from its own parent.
  2. The parent passes appropriate constraints to its child.
  3. The child determines a size within those constraints.
  4. The child reports its size to the parent.
  5. The parent positions the child.

18. Parent Widgets Can Provide Styling

Some parent widgets provide visual properties around their children.

Container(
  padding: const EdgeInsets.all(20),
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
  ),
  child: const Text(
    'Flutter',
    style: TextStyle(
      color: Colors.white,
      fontSize: 20,
    ),
  ),
)

Tree:

Container
└── Text

The parent provides padding and decoration, while the child provides the text content.


19. Parent Widgets and Alignment

Widgets such as Center and Align control the positioning of their child.

Align(
  alignment: Alignment.topRight,
  child: const Text('Hello'),
)

Tree:

Align
└── Text

The Align widget determines where its child is positioned within the available space.


20. Parent Widgets and Padding

Padding adds space around its child.

Padding(
  padding: const EdgeInsets.all(20),
  child: const Text('Hello Flutter'),
)

Tree:

Padding
└── Text

The parent applies padding around the child without requiring the child itself to know about that padding.


21. Parent Widgets and Size

SizedBox can be used to provide a specific size for its child.

SizedBox(
  width: 200,
  height: 100,
  child: const Text('Flutter'),
)

Tree:

SizedBox
└── Text

22. Parent-Child Relationship with Expanded

Expanded is a specialized layout widget that is intended to be used inside Row, Column, or Flex.

Row(
  children: [
    Expanded(
      child: Container(
        height: 100,
        color: Colors.blue,
      ),
    ),
  ],
)

Tree:

Row
└── Expanded
    └── Container

The expected relationship is important: Expanded should be placed under a compatible Row, Column, or Flex. :contentReference[oaicite:3]{index=3}


23. Why Parent Matters for Expanded

The following structure is valid:

Column(
  children: [
    Expanded(
      child: Text('Content'),
    ),
  ],
)

But placing Expanded under an incompatible parent can produce an Incorrect use of ParentDataWidget error.

Example of an incorrect structure:

Container(
  child: Expanded(
    child: Text('Wrong'),
  ),
)

The important lesson is that some widgets depend on a specific ancestor or parent layout widget.


24. Parent-Child Relationship with Positioned

Positioned is designed to be used inside a Stack.

Stack(
  children: [
    Positioned(
      top: 20,
      right: 20,
      child: const Text('Hello'),
    ),
  ],
)

Tree:

Stack
└── Positioned
    └── Text

Positioned expects a Stack ancestor because it provides positioning information to the stack layout system. :contentReference[oaicite:4]{index=4}


25. Parent-Child Relationship with Card

Card(
  child: Padding(
    padding: const EdgeInsets.all(16),
    child: Column(
      children: [
        const Text('Product'),
        const Text('₹999'),
      ],
    ),
  ),
)

Tree:

Card
└── Padding
    └── Column
        ├── Text
        └── Text

Each widget has a clear responsibility in the hierarchy.


26. Parent-Child Relationship in a Login Screen

Scaffold
├── AppBar
│   └── Text
└── Padding
    └── Column
        ├── Text
        ├── TextField
        ├── TextField
        └── ElevatedButton
            └── Text

Example:

Scaffold(
  appBar: AppBar(
    title: const Text('Login'),
  ),
  body: Padding(
    padding: const EdgeInsets.all(20),
    child: Column(
      children: [
        const Text('Login Account'),
        const TextField(
          decoration: InputDecoration(
            labelText: 'Email',
          ),
        ),
        const TextField(
          obscureText: true,
          decoration: InputDecoration(
            labelText: 'Password',
          ),
        ),
        ElevatedButton(
          onPressed: () {},
          child: const Text('Login'),
        ),
      ],
    ),
  ),
)

27. Parent-Child Relationship in a Profile Screen

Scaffold
└── Padding
    └── Column
        ├── CircleAvatar
        ├── Text
        ├── Text
        └── Row
            ├── Icon
            ├── Icon
            └── Icon

Here, the Column acts as the parent for the profile elements, while the Row acts as a child of the Column and a parent of its icons.


28. Parent-Child Relationship and Stateful Widgets

Parent-child relationships become especially important when managing state.

A parent can own state and pass the current value to a child through constructor parameters.

class ParentWidget extends StatefulWidget {
  const ParentWidget({super.key});

  @override
  State createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State {
  bool isActive = false;

  @override
  Widget build(BuildContext context) {
    return ChildWidget(
      active: isActive,
      onChanged: (value) {
        setState(() {
          isActive = value;
        });
      },
    );
  }
}

class ChildWidget extends StatelessWidget {
  const ChildWidget({
    required this.active,
    required this.onChanged,
    super.key,
  });

  final bool active;
  final ValueChanged onChanged;

  @override
  Widget build(BuildContext context) {
    return Switch(
      value: active,
      onChanged: onChanged,
    );
  }
}

In this example, the parent manages the state and passes the current state and callback to the child. Flutter's documentation describes this as one common approach to state management: the parent manages the child's state and the child communicates changes back through a callback. :contentReference[oaicite:5]{index=5}


29. Data Flow from Parent to Child

Current data commonly flows down the widget hierarchy through constructor parameters.

Parent
  ↓
Child
  ↓
Grandchild

Example:

class UserCard extends StatelessWidget {
  const UserCard({
    required this.name,
    super.key,
  });

  final String name;

  @override
  Widget build(BuildContext context) {
    return Text(name);
  }
}

Parent usage:

UserCard(
  name: 'Manish',
)

Here, the parent supplies the name value to the child widget.


30. Events Can Flow from Child to Parent

Although data is commonly passed from parent to child, a child can notify its parent about an event by using a callback.

class ChildButton extends StatelessWidget {
  const ChildButton({
    required this.onPressed,
    super.key,
  });

  final VoidCallback onPressed;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: const Text('Click'),
    );
  }
}

The parent can provide the callback:

ChildButton(
  onPressed: () {
    print('Button clicked');
  },
)

The basic communication pattern is:

Parent
  ↓ data
Child
  ↓ callback/event
Parent

This pattern is commonly used to keep state in an appropriate parent while allowing child widgets to report user interactions. :contentReference[oaicite:6]{index=6}


31. Parent-Child Communication Example

import 'package:flutter/material.dart';

void main() {
  runApp(const MaterialApp(
    home: ParentPage(),
  ));
}

class ParentPage extends StatefulWidget {
  const ParentPage({super.key});

  @override
  State createState() => _ParentPageState();
}

class _ParentPageState extends State {
  String message = 'Waiting...';

  void updateMessage() {
    setState(() {
      message = 'Button clicked!';
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(message),
            ChildButton(
              onPressed: updateMessage,
            ),
          ],
        ),
      ),
    );
  }
}

class ChildButton extends StatelessWidget {
  const ChildButton({
    required this.onPressed,
    super.key,
  });

  final VoidCallback onPressed;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: const Text('Update'),
    );
  }
}

Relationship

ParentPage
├── Text
└── ChildButton
    └── ElevatedButton
        └── Text

The parent owns the state, while the child sends an event back through the callback.


32. Parent-Child Relationship and BuildContext

BuildContext represents a widget's location in the widget tree. It is supplied to the build() method and is used by many Flutter APIs to access information associated with that location. :contentReference[oaicite:7]{index=7}

Example:

@override
Widget build(BuildContext context) {
  return Text(
    Theme.of(context).textTheme.bodyLarge?.fontSize.toString() ?? '',
  );
}

The context allows a widget to access information provided by appropriate ancestors in the widget tree.


33. Parent-Child Relationship and Theme

A theme can be defined higher in the tree and accessed by descendant widgets.

MaterialApp
└── Theme
    └── Scaffold
        └── Column
            └── Text

Example:

MaterialApp(
  theme: ThemeData(
    colorSchemeSeed: Colors.blue,
  ),
  home: const HomePage(),
)

Widgets below the theme can access theme information through the appropriate Flutter APIs.


34. Parent-Child Relationship and Inherited Data

Flutter provides inherited mechanisms for making information available to descendants.

A simplified structure can be represented as:

Parent
└── Inherited Data
    └── Child
        └── Grandchild

This is one reason understanding ancestor and descendant relationships is important when working with Flutter state and data-sharing mechanisms.


35. Parent and Descendant Widgets

It is useful to understand the difference between a direct child and a descendant.

TermMeaning
ParentDirect widget containing another widget
ChildDirect widget contained by another widget
AncestorAny widget higher in the hierarchy
DescendantAny widget below another widget
SiblingWidgets that share the same parent

Example

Column
├── Text
├── Row
│   ├── Icon
│   └── Text
└── Button

Here:

  • Column is the parent of Text, Row, and Button.
  • Row and Button are siblings.
  • Icon is a child of Row.
  • Column is an ancestor of Icon.
  • Icon is a descendant of Column.

36. Parent-Child Relationship and Sibling Widgets

Sibling widgets are widgets that have the same direct parent.

Row
├── Icon
├── SizedBox
└── Text

Here, Icon, SizedBox, and Text are siblings because they all belong directly to the same Row.


37. Complete Widget Hierarchy Example

MaterialApp
└── Scaffold
    ├── AppBar
    │   └── Text
    └── SafeArea
        └── Padding
            └── Column
                ├── CircleAvatar
                │   └── Icon
                ├── SizedBox
                ├── Text
                ├── Row
                │   ├── Icon
                │   ├── SizedBox
                │   └── Text
                ├── Card
                │   └── Padding
                │       └── Column
                │           ├── Text
                │           └── Text
                └── ElevatedButton
                    └── Text

This demonstrates multiple levels of parent-child relationships in a realistic Flutter screen.


38. Widget Tree and Element Tree

Flutter's widget tree describes the UI configuration, while the element tree maintains instantiated positions of widgets in the hierarchy. Flutter uses elements to maintain relationships and state across builds. :contentReference[oaicite:8]{index=8}

A simplified representation is:

Widget Tree
    ↓
Element Tree
    ↓
Render Objects
    ↓
Layout and Painting
    ↓
Visible UI

This distinction becomes important when learning Flutter's build process and performance.


39. Widget Tree Inspection

Flutter DevTools provides a Widget Inspector that allows developers to visually inspect and explore the widget tree. It can help developers understand layouts and diagnose layout problems. :contentReference[oaicite:9]{index=9}

When inspecting a widget tree, you can identify:

  • Parent widgets.
  • Child widgets.
  • Sibling widgets.
  • Widget properties.
  • Constraints.
  • Widget sizes.
  • Unexpected nesting.

40. Common Parent-Child Errors

Error 1: Incorrect Use of Expanded

Container(
  child: Expanded(
    child: Text('Hello'),
  ),
)

Expanded should normally be placed inside a compatible Row, Column, or Flex.

Error 2: Incorrect Use of Positioned

Column(
  children: [
    Positioned(
      top: 10,
      child: Text('Hello'),
    ),
  ],
)

Positioned is intended for use under a Stack.

Error 3: Unbounded Constraints

Some parent-child combinations can result in unbounded width or height. Understanding how constraints move through the hierarchy helps diagnose these issues. :contentReference[oaicite:10]{index=10}


41. Best Practices for Parent-Child Relationships

  • Understand what each widget expects from its parent.
  • Use child for a single child and children for multiple children where the API provides them.
  • Use Row for horizontal layouts.
  • Use Column for vertical layouts.
  • Use Stack for overlapping layouts.
  • Use Expanded only in appropriate Flex layouts.
  • Use Positioned within a Stack.
  • Keep widget trees readable by extracting reusable widgets.
  • Understand constraints before trying random layout fixes.
  • Use Flutter Inspector when debugging complex widget hierarchies.
  • Keep state in an appropriate widget and communicate through parameters and callbacks.

42. Practical Example: Product Card

import 'package:flutter/material.dart';

class ProductCard extends StatelessWidget {
  const ProductCard({super.key});

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Icon(
              Icons.shopping_bag,
              size: 50,
            ),
            const SizedBox(height: 10),
            const Text(
              'Flutter Course',
              style: TextStyle(
                fontSize: 20,
                fontWeight: FontWeight.bold,
              ),
            ),
            const Text('Learn Flutter from basics to advanced.'),
            const SizedBox(height: 10),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                const Text(
                  '₹999',
                  style: TextStyle(
                    fontSize: 18,
                    fontWeight: FontWeight.bold,
                  ),
                ),
                ElevatedButton(
                  onPressed: () {},
                  child: const Text('Buy'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

Widget Tree

ProductCard
└── Card
    └── Padding
        └── Column
            ├── Icon
            ├── SizedBox
            ├── Text
            ├── Text
            ├── SizedBox
            └── Row
                ├── Text
                └── ElevatedButton
                    └── Text

43. Practical Example: Parent Controls Child

import 'package:flutter/material.dart';

class ParentPage extends StatefulWidget {
  const ParentPage({super.key});

  @override
  State createState() => _ParentPageState();
}

class _ParentPageState extends State {
  bool isSelected = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ChildCard(
          selected: isSelected,
          onSelected: (value) {
            setState(() {
              isSelected = value;
            });
          },
        ),
      ),
    );
  }
}

class ChildCard extends StatelessWidget {
  const ChildCard({
    required this.selected,
    required this.onSelected,
    super.key,
  });

  final bool selected;
  final ValueChanged onSelected;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        Text(
          selected ? 'Selected' : 'Not Selected',
        ),
        Switch(
          value: selected,
          onChanged: onSelected,
        ),
      ],
    );
  }
}

Relationship

ParentPage
└── Scaffold
    └── Center
        └── ChildCard
            ├── Text
            └── Switch

The parent owns isSelected. The child receives the value and reports changes using onSelected.


44. Important Concept: Composition

Flutter encourages composition instead of building every interface as one large widget. A widget can be created by combining smaller widgets.

For example:

ProfilePage
└── ProfileHeader
    ├── CircleAvatar
    └── Text

The ProfileHeader itself can be a custom widget composed of several smaller widgets.

This approach makes applications easier to understand, reuse, test, and maintain. Flutter's architecture documentation specifically describes widgets as units of composition that form a hierarchy through nesting. :contentReference[oaicite:11]{index=11}


45. Interview Questions

Q1. What is a parent widget?

A parent widget is a widget that contains another widget or widgets.

Q2. What is a child widget?

A child widget is a widget contained inside another widget.

Q3. Can a widget be both a parent and a child?

Yes. A widget can be a child of one widget while simultaneously acting as a parent of another widget.

Q4. What is the difference between child and children?

child generally represents one widget, while children represents multiple widgets.

Q5. What are sibling widgets?

Sibling widgets are widgets that share the same direct parent.

Q6. What is an ancestor widget?

An ancestor is a widget located higher in the widget hierarchy.

Q7. What is a descendant widget?

A descendant is a widget located below another widget in the hierarchy.

Q8. What is BuildContext?

BuildContext represents the location of a widget within the widget tree.

Q9. Why does Expanded require a specific parent?

Expanded participates in Flex layout and therefore expects a compatible Row, Column, or Flex ancestor.

Q10. Why is understanding parent-child relationships important?

It helps developers understand layout, constraints, data flow, state management, widget composition, and common Flutter errors.


46. Practice Exercise

Create a Flutter profile screen with the following structure:

  1. Create a Scaffold.
  2. Add an AppBar.
  3. Add a Column in the body.
  4. Add a CircleAvatar.
  5. Add a user name and email.
  6. Add a Row containing three icons.
  7. Add a Card containing user details.
  8. Add an ElevatedButton.
  9. Draw the complete parent-child widget tree.

Expected Structure

Scaffold
├── AppBar
│   └── Text
└── Column
    ├── CircleAvatar
    ├── Text
    ├── Text
    ├── Row
    │   ├── Icon
    │   ├── Icon
    │   └── Icon
    ├── Card
    │   └── Text
    └── ElevatedButton
        └── Text

47. Quick Revision Table

ConceptExplanation
ParentWidget that contains another widget
ChildWidget contained inside another widget
AncestorWidget located higher in the hierarchy
DescendantWidget located below another widget
SiblingWidgets sharing the same parent
childProperty used by many widgets for one child
childrenProperty used by many widgets for multiple children
RowArranges children horizontally
ColumnArranges children vertically
StackAllows children to overlap
ExpandedExpands a child within a Flex layout
PositionedPositions a child within a Stack
BuildContextRepresents a widget's location in the widget tree

48. Key Takeaways

  • Flutter interfaces are built using a hierarchy of widgets.
  • A widget containing another widget is its parent.
  • A widget contained inside another widget is its child.
  • A widget can be both a child and a parent at the same time.
  • child is generally used for a single child.
  • children is generally used for multiple children.
  • Parent widgets can influence the layout and constraints of their children.
  • Data commonly flows from parent to child through constructor parameters.
  • Children can notify parents using callbacks.
  • Some widgets require compatible parent layouts, such as Expanded inside Flex widgets and Positioned inside Stack.
  • Understanding parent-child relationships is essential for debugging Flutter layout and state-management problems.
  • Flutter Inspector can be used to visually inspect widget hierarchies.

49. Learning Resources


Conclusion

Understanding parent-child relationships is essential for learning Flutter because almost every Flutter interface is created by composing widgets inside other widgets. Parents can organize, constrain, position, style, or provide context to their children, while children can receive data from parents and notify parents about user interactions through callbacks. Once you understand child, children, ancestors, descendants, siblings, constraints, and parent-specific widgets such as Expanded and Positioned, building and debugging Flutter interfaces becomes much easier.

whatsapp